package com.lock;

import org.junit.Test;

/**
 * @author: csh
 * @Date: 2021/12/19 14:50
 * @Description: 关于类的被动使用，即不会进行类的初始化操作，即不会调用<clinet>()
 *
 * 1，当访问一个静态字段时，只有真正声明这个字段的类才会被初始化。
 *  > 当通过子类引用父类的静态变量，不会导致子类初始化；
 * 2.通过数组定义类的引用，不会触发此类的初始化
 * 3.引用常量不会触发此类或接口的初始化。因为常量在链接阶段就已经被显式赋值了。
 * 4.调用ClassLoader类的loadeClass()方法加载一个类，并不是对类的主动使用，不会导致类的初始化。
 *
 *  说明：没有初始化的类，不意味的没有加载;
 */

public class PassiveUse1 {

    @Test
    public void test1(){
        System.out.println(Child.num);
    }

    @Test
    public void test2(){
        Parent[] parents = new Parent[10];
        System.out.println(parents.getClass());
        System.out.println(parents.getClass().getSuperclass());

        parents[0] = new Parent();
        parents[1  ] = new Parent();

    }

}

class Parent{
    static {
        System.out.println("Parent的初始化过程");
    }
    public static int num = 1;

}

class  Child extends Parent{
    static {
        System.out.println("child的初始化过程");
    }
}

